#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import time
import os
import webbrowser
from bs4 import BeautifulSoup

class BiliBangumiCrawler:
    """B站追番列表爬虫"""
    
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Referer': 'https://www.bilibili.com/',
        }
        # 存储爬取的番剧数据
        self.bangumi_list = []
        # 数据保存路径
        self.data_path = 'bangumi_data.json'
        
    def login_required(self):
        """自动打开浏览器帮助用户获取Cookie"""
        print("正在为您打开浏览器，请登录B站账号...")
        
        # 打开B站登录页面
        login_url = "https://passport.bilibili.com/login"
        webbrowser.open(login_url)
        
        print("\n浏览器已打开，请完成以下操作：")
        print("1. 在浏览器中登录您的B站账号")
        print("2. 登录成功后，按F12打开开发者工具")
        print("3. 切换到Network（网络）标签")
        print("4. 刷新页面，在请求中找到任意一个B站的请求")
        print("5. 点击该请求，在右侧的Headers（标头）中找到Cookie字段")
        print("6. 复制完整的Cookie值（通常以SESSDATA=开头的一长串字符）")
        print("\n提示：您也可以手动打开浏览器访问 https://www.bilibili.com 进行登录")
        
        # 给用户一些时间完成登录
        time.sleep(3)
        
        return input("\n请输入您复制的Cookie值: ")
        
    def get_bangumi_list(self, cookie):
        """获取用户的追番列表"""
        # 设置Cookie
        self.headers['Cookie'] = cookie
        
        # 获取用户MID（从Cookie中提取或通过API获取）
        # 从测试结果看，用户MID是107942000
        user_mid = 107942000
        
        # B站追番API - 使用正确的API端点
        url = f"https://api.bilibili.com/x/space/bangumi/follow/list"
        
        # 追番类型: 1=追番中, 2=已看完
        types = {1: "watching", 2: "finished"}
        
        # 遍历获取不同状态的追番
        for type_id, status in types.items():
            page = 1
            while True:
                params = {
                    'vmid': user_mid,  # 用户MID
                    'type': type_id,   # 1: 追番中, 2: 已看完
                    'pn': page,        # 页码
                    'ps': 15,          # 每页数量
                    'ts': int(time.time() * 1000)  # 时间戳，避免缓存
                }
                
                try:
                    response = requests.get(url, headers=self.headers, params=params, timeout=10)
                    
                    # 打印调试信息
                    print(f"请求URL: {response.url}")
                    print(f"状态码: {response.status_code}")
                    
                    data = response.json()
                    
                    # 检查是否成功获取数据
                    if data['code'] != 0:
                        print(f"获取数据失败: {data['message']}")
                        print(f"错误代码: {data['code']}")
                        # 如果是权限问题，提示用户检查Cookie
                        if data['code'] in [-101, -400, -403]:
                            print("可能是Cookie无效或已过期，请检查Cookie是否正确")
                        break
                    
                    # 获取番剧列表
                    bangumi_data = data['data']['list']
                    
                    # 如果没有数据，说明已经到达最后一页
                    if not bangumi_data:
                        print(f"第{page}页没有数据，停止翻页")
                        break
                    
                    print(f"第{page}页获取到{len(bangumi_data)}条数据")
                    
                    # 处理每个番剧的数据
                    for bangumi in bangumi_data:
                        bangumi_info = {
                            'title': bangumi['title'],
                            'cover': bangumi['cover'],
                            'evaluate': bangumi['evaluate'],
                            'status': status,
                            'score': bangumi.get('score', '暂无评分'),
                            'progress': f"{bangumi.get('progress', '0')}/{bangumi.get('total_count', '?')}",
                            'url': f"https://www.bilibili.com/bangumi/play/ss{bangumi['season_id']}",
                            'season_id': bangumi['season_id'],
                            'media_id': bangumi.get('media_id', ''),
                        }
                        self.bangumi_list.append(bangumi_info)
                    
                    print(f"成功获取{status}番剧，第{page}页，共{len(bangumi_data)}条")
                    
                    # 翻页
                    page += 1
                    # 防止请求过快
                    time.sleep(1)
                    
                except Exception as e:
                    print(f"爬取过程中出现错误: {e}")
                    break
        
        print(f"共获取到 {len(self.bangumi_list)} 部番剧")
        return self.bangumi_list
    
    def save_data(self):
        """保存番剧数据到JSON文件"""
        with open(self.data_path, 'w', encoding='utf-8') as f:
            json.dump({
                'update_time': time.strftime('%Y-%m-%d %H:%M:%S'),
                'total': len(self.bangumi_list),
                'data': self.bangumi_list
            }, f, ensure_ascii=False, indent=2)
        print(f"数据已保存到 {self.data_path}")
        
    def run(self):
        """运行爬虫"""
        cookie = self.login_required()
        self.get_bangumi_list(cookie)
        self.save_data()
        return self.data_path

if __name__ == "__main__":
    crawler = BiliBangumiCrawler()
    data_file = crawler.run()
    print(f"爬虫执行完毕，数据已保存到 {data_file}")